package com.iprojectmanager.businessclass;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.iprojectmanager.managers.*;
import com.iprojectmanager.entities.*;
import com.iprojectmanager.views.*;
import java.util.*;

/**
 * @author Alucard
 */
public class ProjectControl extends HttpServlet
{

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException 
    {
        String op = request.getParameter("operacionesproyectos");
        boolean result = false;

            //Esto ocurre si va de VistaAdministrador a Vista Proyecto
            if(request.getParameter("operacionesproyectos") != null)
            {
                if(request.getParameter("operacionesproyectos").compareTo("modificar") == 0 && 
                   request.getParameter("proyectos") == null)
                {
                    RequestDispatcher disp = request.getRequestDispatcher("VistaAdministrador");
                    disp.forward(request, response);
                }else if (request.getParameter("operacionesproyectos").compareTo("crear") == 0 ||
                          request.getParameter("operacionesproyectos").compareTo("modificar") == 0)
                {
                    request.setAttribute("operacion",op);
                    RequestDispatcher disp = request.getRequestDispatcher("VistaProyecto");
                    disp.forward(request, response);
                }
                else if(request.getParameter("operacionesproyectos").compareTo("listarproyecto") == 0)
                {
                    //request.setAttribute("operacion",op);
                    RequestDispatcher disp = request.getRequestDispatcher("VistaListaProyectos");
                    disp.forward(request, response);
                }
                else {
                    RequestDispatcher disp = request.getRequestDispatcher("VistaEliminarProyecto");
                    disp.forward(request, response);
                }
            }
            //Esto ocurre si va a Crear un Proyecto
            else if(request.getParameter("CA") != null )
            {
                    result = validarAlta(request,response);
                        if(result == true)
                        {
                            response.getWriter().println("Alta valida");
                            request.getRequestDispatcher("VistaAdministrador").forward(request, response);
                        }
                        else
                        {
                            response.getWriter().println("Alta no valida");
                            request.getRequestDispatcher("VistaProyecto").forward(request, response);
                        }
            }
            //Esto ocurre si va a Modificar un Proyecto
            else if(request.getParameter("MA") != null)
            {
                if(validarCambio(request,response) == true)
                {
                    request.getRequestDispatcher("VistaAdministrador").forward(request, response);
                }else
                {
                    request.setAttribute("operacion","modificar");
                    request.getRequestDispatcher("VistaProyecto").forward(request, response);
                }
            }
            //Esto ocurre si va a Eliminar un proyecto
            else if (request.getParameter("Aceptar") != null && request.getParameter("Aceptar").compareTo("Eliminar") == 0) {
                    deleteProyecto(request,response);
                    request.getRequestDispatcher("VistaAdministrador").forward(request, response);
            }
    } 

    @Override
    public String getServletInfo() {
        return "Clase de control para proyectos";
    }

   private boolean validarCambio(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException 
    {
        boolean flag=false;
        ProjectManager manager = new ProjectManager();
        Proyecto project = manager.getProyecto(Integer.valueOf(request.getParameter("id")));

        String name = request.getParameter("tbNombreProyecto");
        String iday = request.getParameter("diai");
        String imonth = request.getParameter("mesi");
        String iyear = request.getParameter("yeari");
        String fday = request.getParameter("diaf");
        String fmonth = request.getParameter("mesf");
        String fyear = request.getParameter("yearf");
        String idlider = request.getParameter("lider");

        
            if(name.compareTo("") != 0 && iday.compareTo("") != 0 &&
               imonth.compareTo("") != 0 && iyear.compareTo("") != 0 &&
               fday.compareTo("") != 0 && fmonth.compareTo("") != 0 &&
               fyear.compareTo("") != 0 && idlider.compareTo("") != 0)
            {
                if(validarFecha(iday,imonth,iyear,fday,fmonth,fyear) == true)
                {
                    //Validar que el lider no este en otro proyecto al
                    //mismo tiempo y que no exista el mismo proyecto
                    Date initdate = new Date(Integer.valueOf(iyear)-1900,Integer.valueOf(imonth),Integer.valueOf(iday));
                    Date enddate = new Date(Integer.valueOf(fyear)-1900,Integer.valueOf(fmonth),Integer.valueOf(fday));
                    //Valida que la fecha no se haya o modificado o en su defecto si se modifico que no sea
                    //menor a la fecha actual
                    //Date current = new Date();
                    //  current.setDate(current.getDate()-1);
                    if(initdate.before(new Date()) == false ||
                       (initdate.before(project.getFechainicio()) == false && initdate.after(project.getFechainicio()) == false))
                    {
                        UserManager user = new UserManager();
                        ActivitiesManager activitiesmanager = new ActivitiesManager();
                        LiderProyecto lider = (LiderProyecto)user.getUsuario(Integer.valueOf(idlider));
                            project.setNombre(name);
                            
                            if(initdate.equals(project.getFechainicio()) == false)
                            {
                                int diff[] = Utilities.getDiff(project.getFechainicio(),initdate);
                                for(Actividad activity : project.getActividades())
                                {
                                    activity.setNewDates(diff);
                                    activitiesmanager.exec(activity,ActivitiesManager.UPDATE);
                                }
                            }
                            project.setFechainicio(initdate);
                            project.setFechafin(enddate);
                            project.setLider(lider);
                            flag = true;
                            manager.exec(project, IProjectManager.UPDATE);
                            lider.setProyecto(project);
                            manager.exec(lider,IProjectManager.UPDATE);
                     }else
                     {
                        response.getWriter().print("ERROR: La Fecha de Comienzo no puede ser menor a la actual");
                        response.getWriter().print((new Date()).toString());
                        response.getWriter().close();
                     }
                 }
            }
        
        return flag;
    }
    
    private boolean validarAlta(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException
    {
        boolean flag=false;
        ProjectManager manager = new ProjectManager();
        String name = request.getParameter("tbNombreProyecto");
        String iday = request.getParameter("diai");
        String imonth = request.getParameter("mesi");
        String iyear = request.getParameter("yeari");
        String fday = request.getParameter("diaf");
        String fmonth = request.getParameter("mesf");
        String fyear = request.getParameter("yearf");
        String idlider = request.getParameter("lider");

        
            if(name.compareTo("") != 0 && iday.compareTo("") != 0 &&
               imonth.compareTo("") != 0 && iyear.compareTo("") != 0 &&
               fday.compareTo("") != 0 && fmonth.compareTo("") != 0 &&
               fyear.compareTo("") != 0 && idlider.compareTo("") != 0)
            {
                if(validarFecha(iday,imonth,iyear,fday,fmonth,fyear) == true)
                {
                    //Validar que el lider no este en otro proyecto al
                    //mismo tiempo y que no exista el mismo proyecto
                    Date initdate = new Date(Integer.valueOf(iyear)-1900,Integer.valueOf(imonth),Integer.valueOf(iday));
                    Date enddate = new Date(Integer.valueOf(fyear)-1900,Integer.valueOf(fmonth),Integer.valueOf(fday));
                    Date current = new Date();
                        current.setDate(current.getDate()-1);
                    if(initdate.before(current) != true)
                    {
                        if(manager.getProyecto(name) == null)
                        {
                            if(enddate.before(initdate) == false)
                            {
                                UserManager user = new UserManager();
                                Proyecto project = new Proyecto(name);
                                LiderProyecto lider = (LiderProyecto)user.getUsuario(Integer.valueOf(idlider));
                                    project.setFechainicio(initdate);
                                    project.setFechafin(enddate);
                                    project.setLider(lider);
                                    flag = true;
                                    manager.exec(project, IProjectManager.INSERT);
                                    lider.setProyecto(project);
                                    manager.exec(lider,IProjectManager.UPDATE);
                            }else
                            {
                                response.getWriter().print("ERROR: La Fecha de terminacion no puede ser menor a la de inicio");
                            }
                        }else
                        {
                            response.getWriter().print("ERROR: Dato incorrecto");
                        }
                     }else
                     {
                        response.getWriter().print("ERROR: La Fecha de Comienzo no puede ser menor a la actual");
                        response.getWriter().print((new Date()).toString());
                     }
                 }else
                 {
                    response.getWriter().print("ERROR");
                 }
            }
        
        return flag;
    }

    //Falata Validar Fecha
    public boolean validarFecha(String iday,String imonth,String iyear,
                                String fday,String fmonth,String fyear)
    {
        boolean flag=true;
            try
            {
                int iiday = Integer.valueOf(iday);
                int iimonth = Integer.valueOf(imonth);
                int iiyear = Integer.valueOf(iyear);
                int ifday = Integer.valueOf(fday);
                int ifmonth =Integer.valueOf(fmonth);
                int ifyear = Integer.valueOf(fyear);
                
                    if(!(iiday > -1 && iiyear >= ((new Date()).getYear()+1900) &&
                       ifday > -1 && ifyear >= ((new Date()).getYear()+1900) &&
                       iiday < 32 && ifday < 32))
                    {
                        flag = false;
                    }
                
            }catch(Exception ex)
            {
                flag = false;
            }
        
        return flag;
    }

    //Eliminar proyecto
    public void deleteProyecto(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException
    {
        String[] idproyectos =  request.getParameterValues("id");
        ProjectManager pm = new ProjectManager();
        UserManager um = new UserManager();

        Proyecto aux = null;
        LiderProyecto lider = null;
        ArrayList<IntegranteProyecto> integrantes = null;
        if (idproyectos != null) {
            for (String id : idproyectos){
                aux = pm.getProyecto(Integer.valueOf(id));
                //Le quitamos el proyecto al lider.
                lider = aux.getLider();
                if (lider != null) {
                    lider.setProyecto(null);
                    pm.exec(lider, IProjectManager.UPDATE);
                }
                //Quitamos todos los integrantes del proyecto.
                integrantes = um.getIntegrantesFromProyecto(Long.valueOf(id));
                if (integrantes != null){
                    for (IntegranteProyecto integrante : integrantes){
                        integrante.setProyecto(null);
                        um.exec(integrante, UserManager.UPDATE);
                    }
                }
                //Eliminamos proyecto.
                pm.exec(aux, IProjectManager.DELETE);
            }
        }
        //Redireccionamos vista.
        request.getRequestDispatcher("VistaAdministrador").forward(request,response);
    }

}
